class_name Projectile
extends RigidBody3D

## 投掷物基类
## 负责处理投掷物的基础物理行为和生命周期管理
## 遵循单一职责原则：只负责投掷物的核心功能

# 投掷物基础属性
var damage: int = 0
var thrower_entity: Entity = null
var auto_destroy_time: float = 10.0

# 节点引用
@onready var mesh_instance: MeshInstance3D = $MeshInstance3D
@onready var collision_shape: CollisionShape3D = $CollisionShape3D
@onready var destroy_timer: Timer = $DestroyTimer

func _ready():
	# 连接碰撞信号
	body_entered.connect(_on_collision_detected)
	
	# 设置定时器
	if destroy_timer:
		destroy_timer.timeout.connect(_on_destroy_timer_timeout)
		destroy_timer.start()

## 初始化投掷物参数
## @param item_data: 物品数据字典
## @param thrower: 投掷者实体
func initialize_from_item(item_data: Dictionary, thrower: Entity = null):
	damage = item_data.get("damage", 0)
	thrower_entity = thrower
	gravity_scale = item_data.get("gravity_scale", 1.0)
	auto_destroy_time = item_data.get("auto_destroy_time", 10.0)
	
	# 更新定时器时间
	if destroy_timer:
		destroy_timer.wait_time = auto_destroy_time

## 设置投掷物网格
## @param new_mesh: 新的网格资源
func set_projectile_mesh(new_mesh: Mesh):
	if mesh_instance:
		mesh_instance.mesh = new_mesh

## 设置碰撞形状
## @param new_shape: 新的碰撞形状资源
func set_collision_shape(new_shape: Shape3D):
	if collision_shape:
		collision_shape.shape = new_shape

## 设置初始发射速度
## @param velocity: 初始速度向量
func launch_with_velocity(velocity: Vector3):
	linear_velocity = velocity

## 碰撞检测处理（私有方法）
## @param body: 碰撞的物体
func _on_collision_detected(body: Node):
	# 避免与投掷者自身碰撞
	if thrower_entity and body == thrower_entity.attach_node:
		return
	
	# 检查是否击中Monster
	_check_monster_hit(body)
	
	# 调用虚函数处理碰撞
	on_impact(body)

## 检查是否击中Monster并应用效果
## @param body: 碰撞的物体
func _check_monster_hit(body: Node):
	# 检查是否为Monster节点
	if body.name == "Monster" or body.has_method("apply_slow_effect"):
		# 查找Monster的AI组件
		var monster_ai = HNodeUtilties.get_node_by_type(body, MonsterAI)
		if monster_ai:
			monster_ai.apply_slow_effect()
			print("投掷物击中Monster，触发减速效果")

## 碰撞处理虚函数（供子类重写）
## @param target: 碰撞目标
func on_impact(target: Node):
	# 基类默认行为：简单输出并销毁
	print("投掷物碰撞到:", target.name)
	destroy_projectile()

## 销毁投掷物
func destroy_projectile():
	# 调用销毁前的虚函数
	on_before_destroy()
	queue_free()

## 销毁前处理虚函数（供子类重写）
func on_before_destroy():
	# 基类默认行为：无特殊处理
	pass

## 定时器超时处理
func _on_destroy_timer_timeout():
	print("投掷物生命周期结束，自动销毁")
	destroy_projectile()
